import crypto from './crypto'
import { checkDataType } from './toolkit'
import deepClone from './deepClone'
import dayjs from 'dayjs'

const startSign = 'Ding_D'
const endSign = 'Ding_D'

export function setStorage(key: string, value: any, expire = 24) {
  if (!window.localStorage) {
    console.error('浏览器不支持localstorage')
  }
  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('key值类型需string或number！')
    return null
  }

  const currentTime = new Date().getTime() //当前时间

  const expireTime = currentTime + expire * 60 * 60 * 1000 //期望过期时间 单位：小时

  let data = deepClone(value)

  if (checkDataType(value) === 'object' || checkDataType(value) === 'array')
    data = JSON.stringify(value)

  // 增加过期时间
  data += startSign + expireTime + endSign

  const encData = crypto.Encrypt(data) //数据加密

  const keyEncData = crypto.Encrypt(key) //key数据加密

  console.log(
    `%c存储数据，key:${ key },value:${ JSON.stringify(value) },过期时间:${ dayjs(expireTime).format(
      'YYYY-MM-DD HH:mm:ss'
    ) }`,
    'color:#2bd4bc'
  )

  localStorage.setItem('LH-' + keyEncData, encData)
}

export function getStorage(key: string): any {
  if (!window.localStorage) {
    console.error('浏览器不支持localstorage')
    return null
  }

  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('key 类型错误！')
    return null
  }

  const keyEncData = crypto.Encrypt(key) //key数据加密
  const value = localStorage.getItem('LH-' + keyEncData)

  if (value === null || value === undefined) return null // 找不到对应item时，返回null

  try {
    const decodeData = crypto.Decrypt(value) //数据解密
    // 获取过期时间,返回的是字符串，使用时记得number化
    const expireTime = decodeData
      .substring(decodeData.indexOf(startSign), decodeData.lastIndexOf(endSign))
      .replace(startSign, '')
    const returnData = decodeData.substring(0, decodeData.indexOf(startSign))

    console.log(
      `%c取出数据，key:${ key },value:${ String(returnData) },过期时间:${ dayjs(
        Number(expireTime)
      ).format('YYYY-MM-DD HH:mm:ss') }`,
      'color:#3b83f7'
    )

    // 如果过期时间小于当前时间，移除此localstorage
    if (Number(expireTime) <= new Date().getTime()) {
      // 获取本地缓存时，检测到有效期过期，直接移除数据
      // 后续如果要做过期检测，更新数据，则可以直接根据返回值，先移除所有缓存，然后重新获取赋值
      removeStorage(key)
      // 过期时返回null值
      return null
    }

    return returnData.indexOf('{') === 0 || returnData.indexOf('[') === 0
      ? JSON.parse(returnData)
      : returnData
  } catch (err) {
    console.error('转换中途出错', err)
    return null
  }
}

export function removeStorage(key: string) {
  if (!window.localStorage) {
    console.error('浏览器不支持localstorage')
  }
  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('类型错误！')
    return
  }
  console.log(`%c 移除localstorage, key:${ key }`, 'color:#f11f21')

  localStorage.removeItem('LH-' + key)
}

export function clearStorage() {
  if (!window.localStorage) {
    console.error('浏览器不支持localstorage')
  }
  localStorage.clear()
  return
  const keys = Object.keys(localStorage)
  console.log(keys)

  if (keys.length < 0) return
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i]
    if (key.indexOf('LH-') === 0) {
      removeStorage(key)
    }
  }
}
